package com.mallsystem.goodsservice.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mallsystem.common.bean.Category;
import com.mallsystem.common.bean.Goods;
import com.mallsystem.common.exception.AllException;
import com.mallsystem.common.service.CategoryService;
import com.mallsystem.goodsservice.mapper.CategoryMapper;
import com.mallsystem.goodsservice.mapper.GoodsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;
    @Autowired
    private GoodsMapper goodsMapper;
    @Override
    public boolean insert(Category category) throws AllException {
        /*
        判断被添加的分类对应的父分类是否存在
            1.根据被添加的parentId查询父分类是否存在
            2.判断这个父分类是否是真的父分类（为0）
         */
        if(!category.getParentId().equals(0)) {
            Category parent = categoryMapper.selectById(category.getParentId());
            if (parent == null || (parent != null && !parent.getParentId().equals(0))) {
                throw new AllException("被添加分类的父分类不存在或不合法，无法添加");
            }
        }
        /**
         * 判断同一个父分类下是否有相同子分类
         * 1.查询同一个父分类下所有子分类
         * 2.判断是否重名
         */
        List<Category> categoryList = categoryMapper.selectByParentId(category.getParentId());
        boolean flag = categoryList.stream()
                .anyMatch(item -> item.getName().equals(category.getName()));
        if(flag){
            throw new AllException("被添加分类的名字和同级别其他分类的名字相同，无法添加");
        }
        return categoryMapper.insert(category) == 1;
    }

    @Override
    public boolean delete(Integer id) throws AllException {
        //判断被删除的分类是否存在
        Category category = categoryMapper.selectById(id);
        if(category == null){
            throw new AllException("该分类不存在，无法删除");
        }
        //如果是父分类判断下面是否有子分类
        if(category.getParentId().equals(0) && category.getChildList().size() > 0){
            throw new AllException("该分类下关联子分类，不允许删除");
        }
        //如果是子分类判断其下面是否有商品
        Goods goods = new Goods();
        goods.setCategoryId(id);
        if(goodsMapper.selectByCondition(goods) != null && goodsMapper.selectByCondition(goods).size() > 0){
            throw new AllException("该分类下关联商品，不允许删除");
        }
        return categoryMapper.delete(id) == 1;
    }

    @Override
    public boolean update(Category category) throws AllException {
        //查询被修改之前的详细信息（根据id查询）
        Category oldInfo = categoryMapper.selectById(category.getId());
        Category newInfo = category;
        //判断被修改的分类是否存在
        if(oldInfo == null){
            throw new AllException("该分类不存在，无法修改");
        }
        //如果改分类是父分类且存在子分类，那么这个父分类就不能修改为子分类
        if(oldInfo.getParentId().equals(0) && oldInfo.getChildList().size() > 0 && (newInfo.getParentId() != null && !newInfo.getParentId().equals(0))){
            throw new AllException("该分类存在子分类，无法修改");
        }
        //一个父分类不能把自己设置为自己的父分类
        if(oldInfo.getParentId().equals(0) && !newInfo.getParentId().equals(0) && newInfo.getParentId().equals(oldInfo.getId())){
            throw new AllException("不能设置当前分类为自己父分类，无法修改");
        }
        /*
        判断同一个父分类下是否有同名的子分类
        1.查询同一个父分类下所有的子分类
        2.判断是否同名
         */
        //获取修改之后的父分类id
        Integer parentId = newInfo.getParentId() == null ? oldInfo.getParentId() : newInfo.getParentId();
        //获取修改之后的名字
        String name = newInfo.getName() == null ? oldInfo.getName() : newInfo.getName();
        if(categoryMapper.selectByParentId(parentId)
                .stream()
                .anyMatch(item -> item.getName().equals(name) && !item.getId().equals(category.getId()))){
            throw new AllException("修改之后的分类名与同级别分类名相同，无法修改");
        }
        return categoryMapper.update(category) == 1;
    }
    /*
     分页和不分页都可以使用
     */
    @Override
    public Object selectByCondition(Category condition, Integer pageNum, Integer pageSize) {
        if(pageNum == null){//不分页
            return categoryMapper.selectByCondition(condition);
        }else {//分页
            //设置分页参数
            PageHelper.startPage(pageNum,pageSize);
            //查询
            List<Category> categories = categoryMapper.selectByCondition(condition);
            //创建分页信息对象
            PageInfo<Category> pageInfo = new PageInfo<>(categories);
            return pageInfo;
        }
    }

    @Override
    public Category selectById(Integer id) {
        return categoryMapper.selectById(id);
    }

    @Override
    public boolean updateStatus(Category category) throws AllException {
        Category category1 = categoryMapper.selectById(category.getId());
        if(category1 == null){
            throw new AllException("分类不存在");
        }
        Integer status = category1.getStatus() == 1 ? 0 : 1;
        category1.setStatus(status);
        return categoryMapper.update(category1) == 1;
    }
}
